Cloud One File Storage Securityで検出した不正ファイルをAWS Security Hub経由でメール通知する
はじめに
本記事では、Cloud One File Storage Security(以下、C1FSS)で不正なファイルを検出した際に、AWS Security Hub経由でメール通知を行う方法について解説します。
C1FSSの導入は、AWS CloudFormationテンプレートが提供されているため、比較的容易に構築できます。
ファイルがスキャンされると、スキャン用S3バケット内のオブジェクトのタグに検出結果(正常または不正)が記録されます。
詳細な処理の流れは、以下のドキュメントにまとめられています。
本記事では、上記の基本構成に加えて、不正なファイルを検出した際に検出結果をAWS Security Hubに送信し、Amazon EventBridgeルール経由でメール通知する仕組みの導入方法を解説します。
本システムの構成は以下の通りです
- スキャン用S3バケットでファイルのスキャンを実行
- スキャン結果をLambda関数に送信
- Lambda関数が結果を分析し、不正ファイルと判定された場合のみAWS Security Hubに検出結果を送信
- Security Hubに送信された検出結果をトリガーとして、Amazon EventBridgeルールが起動
- EventBridgeルールに基づき、Amazon SNSを介してメールで通知を送信
前提条件
- 以下の記事に従って、C1FSSを導入済みであること
- 以下の記事に従って、通知用のAmazon SNSトピックを作成済みであること
Security Hubの統合は利用できない
AWS Security Hubの「統合」機能から「結果を受け入れる」を選択すると、Trend Cloud One サービスからAWS Security Hubにセキュリティイベントと評価を送信できます。
しかしながら、現時点では、Trend Cloud One Container Securityのランタイムイベントのみがこの統合機能をサポートしています。
C1FSSはこの統合機能をサポートしていないため、Security Hubの標準的な統合方法では実現できません。
Lambda関数を作成
本実装では、C1FSSのプラグインとして提供されている、FSSマルウェア検出結果をAWS Security Hubに送信するLambda関数を利用します。
AWS CloudShellを利用して、C1FSSのプラグイン用リポジトリをダウンロードし、Lambda関数用のコードをZIP形式で圧縮します。
$ git clone https://github.com/trendmicro/cloudone-filestorage-plugins.git
$ cd cloudone-filestorage-plugins/post-scan-actions/aws-nodejs-securityhub-integration
$ npm --version
10.5.0
$ npm run package
新しいS3バケットを作成し、圧縮したZIPファイルをアップロードします。
$ aws s3 mb s3://cm-hirai-cloudone-securityhub
$ aws s3 cp bundle.zip s3://cm-hirai-cloudone-securityhub/
C1FSSのプラグイン用リポジトリに含まれるCloudFormationテンプレート(template.yaml)を使用して、新しいスタックを作成します。
- stack-name:スタック名は何でもよいです。
- snsScanResultTopicArn: C1FSS導入時にCloudFormationで作成されたSNSトピックのARNに置き換えてください。
- LambdaZipBucket: Lambda関数のコードを含むZIPファイルを保存したS3バケットの名前です。
- LambdaZipKey: S3バケット内のZIPファイルのオブジェクトキー名です。
$ aws cloudformation create-stack \
--stack-name fss-security-hub-integration \
--template-body file://template.yaml \
--parameters \
ParameterKey=snsScanResultTopicArn,ParameterValue=arn:aws:sns:ap-northeast-1:012345678901:Storage-TM-FileStorageSecurity-ScanResultTopic-6iKvNvXcr05o \
ParameterKey=LambdaZipBucket,ParameterValue=cm-hirai-cloudone-securityhub \
ParameterKey=LambdaZipKey,ParameterValue=bundle.zip \
--capabilities CAPABILITY_IAM
このCloudFormationスタックで作成されるリソースは、以下の通り、スキャン結果をトリガーとして起動するLambda関数です。
- Lambda関数
- Lambda関数のIAMポリシーとIAMロール
- Lambda関数のリソースベースポリシー
- 既存のSNSトピックのサブスクリプションにLambda関数を追加
スタックの作成が完了したら、Lambda関数のコードがデプロイされるため、ZIPファイルを保存したS3バケットは不要となります。必要に応じて削除しましょう。
ファイルをアップロードしてみる
EICARテストファイル(ウイルススキャンのテスト用ファイル)をAWS CloudShellを使用してスキャン用S3バケットにアップロードします。
$ curl -O https://secure.eicar.org/eicar.com
$ aws s3 cp eicar.com s3://cm-hirai-c1fss
アップロード後、Security Hubの検出結果画面に以下のように表示されました。
参考として、正常なファイルをアップロードした場合、Security Hubへの送信は行われません。
これにより、不正なファイルの検出時のみ通知が行われることが確認できます。
EventBridgeルールを作成
EventBridgeルールを作成する前に、Security Hubから送信されるイベントの例を以下に示します。
この情報は、後続のEventBridgeルールの設定に役立ちます。
{
"version": "0",
"id": "9f05b441-114a-fb53-09e5-1992a4358043",
"detail-type": "Security Hub Findings - Imported",
"source": "aws.securityhub",
"account": "012345678901",
"time": "2024-09-11T23:33:40Z",
"region": "ap-northeast-1",
"resources": [
"arn:aws:securityhub:ap-northeast-1:012345678901:product/012345678901/default/012345678901/2398e98a-c4bf-4f0b-91c5-1a786263b723"
],
"detail": {
"findings": [
{
"ProductArn": "arn:aws:securityhub:ap-northeast-1:012345678901:product/012345678901/default",
"Types": [
"Unusual Behaviors/Data"
],
"Description": "Malware found!",
"SchemaVersion": "2018-10-08",
"ProductName": "Default",
"GeneratorId": "FSS",
"CreatedAt": "2024-09-11T23:33:28.594Z",
"RecordState": "ACTIVE",
"Title": "S3 Object had malware detected by FSS.",
"Workflow": {
"Status": "NEW"
},
"Severity": {
"Normalized": 70,
"Label": "HIGH"
},
"UpdatedAt": "2024-09-11T23:33:28.594Z",
"CompanyName": "Personal",
"FindingProviderFields": {
"Types": [
"Unusual Behaviors/Data"
],
"Severity": {
"Normalized": 70,
"Label": "HIGH"
}
},
"WorkflowState": "NEW",
"ProductFields": {
"aws/securityhub/FindingId": "arn:aws:securityhub:ap-northeast-1:012345678901:product/012345678901/default/012345678901/2398e98a-c4bf-4f0b-91c5-1a786263b723",
"aws/securityhub/ProductName": "Default",
"aws/securityhub/CompanyName": "Personal"
},
"AwsAccountId": "012345678901",
"Region": "ap-northeast-1",
"Malware": [
{
"Path": "eicar.com",
"Type": "POTENTIALLY_UNWANTED",
"State": "OBSERVED",
"Name": "Eicar_test_file"
}
],
"Id": "012345678901/2398e98a-c4bf-4f0b-91c5-1a786263b723",
"Resources": [
{
"Type": "AwsS3Object",
"Id": "eicar.com"
},
{
"Type": "AwsS3Bucket",
"Id": "cm-hirai-c1fss"
}
],
"ProcessedAt": "2024-09-11T23:33:31.200Z"
}
]
}
}
また、先ほど作成したLambda関数のコードを確認すると、 SecurityHubに送信する検出結果として、GeneratorId
やSeverity
などの重要な値が設定されていることがわかります。
使用されているランタイムバージョンが最新であることも確認できました。
~中略~
const publishToSecurityHub = async (securityhub, securityHubArn, accountId, malwareName, bucket, key) => {
const date = new Date().toISOString()
const params = {
Findings: [
{
AwsAccountId: accountId,
CreatedAt: date,
Description: "Malware found!",
GeneratorId: "FSS",
Id: `${accountId}/${uuidV4()}`,
ProductArn: securityHubArn,
SchemaVersion: "2018-10-08",
Resources: [
{
Id: key,
Type: "AwsS3Object"
},
{
Id: bucket,
Type: "AwsS3Bucket"
},
],
Malware: [
{
Name: malwareName,
Path: key,
State: "OBSERVED",
Type: "POTENTIALLY_UNWANTED"
}
],
Severity: {
Label: "HIGH"
},
Title: "S3 Object had malware detected by FSS.",
Types: [
"Unusual Behaviors/Data"
],
UpdatedAt: date
}
]
}
これらの情報をもとに、Amazon EventBridgeルールを作成します。
このルールにより、特定の条件を満たすSecurity Hubの検出結果をトリガーとして通知を送信できます。
EventBridgeルールのイベントパターンは以下のように設定します。
{
"source": ["aws.securityhub"],
"detail-type": ["Security Hub Findings - Imported"],
"detail": {
"findings": {
"Severity": {
"Label": ["HIGH"]
},
"RecordState": ["ACTIVE"],
"GeneratorId": ["FSS"],
"Workflow": {
"Status": ["NEW"]
}
}
}
}
EventBridgeルールのターゲットとして、先ほど作成したSNSトピックを指定します。また、通知メッセージの内容をカスタマイズするために、以下のように入力パスと入力テンプレートを設定します。
{
"TITLE": "$.detail.findings[0].Title"
"PROCESSED_AT": "$.detail.findings[0].ProcessedAt",
"AWS_ACCOUNT_ID": "$.detail.findings[0].AwsAccountId",
"REGION": "$.detail.findings[0].Region",
"S3_BUCKET": "$.detail.findings[0].Resources[1].Id",
"S3_KEY": "$.detail.findings[0].Resources[0].Id",
}
{
"タイトル": <TITLE>,
"検出結果時間": <PROCESSED_AT>,
"アカウントID": <AWS_ACCOUNT_ID>,
"リージョン名": <REGION>,
"S3バケット名": <S3_BUCKET>,
"キー名": <S3_KEY>
}
設定が完了したら、動作確認するために、再度AWS CloudShellを使用して不正なファイル(EICARテストファイル)をアップロードします。
$ curl -O https://secure.eicar.org/eicar.com
$ aws s3 cp eicar.com s3://cm-hirai-c1fss
ファイルのアップロード後、数秒でメール通知が届きました。以下は受信したメールの内容です。
まとめ
本記事では、Cloud One File Storage Security(C1FSS)で検出した不正ファイルをAWS Security Hub経由でメール通知する方法を解説しました。この実装により、以下のメリットが得られます。
- 不正ファイルの検出をリアルタイムで通知
- AWS Security Hubを活用した集中管理
- Amazon EventBridgeによる柔軟な通知ルールの設定
参考になれば幸いです。